/*-*
 * FILENAME  :
 *    $HeadURL$
 *
 * STATUS  :
 *    $Revision$
 *
 *    $Author$
 *    $Date$
 *  
 *    
 * Copyright (c) 2011 Gonalge Ltda. All rights reserved.
 *
 ****************************************************************/

package org.gonalge.rompecabeza.negocio;

import java.io.Serializable;
import java.util.Random;
import java.util.Vector;

import org.gonalge.rompecabeza.dto.Pieza;

/**
 * 
 * @author Geremias Gonzalez
 */
public class ListaPieza implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -9216786655446666963L;

    private int totalAncho = 430, totalAlto = 430;

    private int ancho = 0, alto = 0;

    private int n = 0;

    private int x = 300, y = 50;

    private int nax = 240;

    private final Vector<Pieza> lPiezas = new Vector<Pieza>();

    private int Fil = 3, Col = 3;

    public ListaPieza() {
        this.x = 245;
        this.y = 75;
        configurar(Fil, Col);
    }

    public void configurar(int f, int c) {
        Fil = f;
        Col = c;
        n = nax / (Fil + Col);
        ancho = (totalAncho - n) / Col + n - 1;
        alto = (totalAlto - n) / Fil + n - 1;
        cargarPiezas();
    }

    public void cargarPiezas() {
        lPiezas.clear();
        for (int i = 0; i < Fil; i++)
            for (int j = 0; j < Col; j++)
                lPiezas.add(crearPieza(i, j));

    }

    public void limpiar() {
        lPiezas.clear();
    }

    public void setXY(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public void desordenar() {
        Random r = new Random();
        for (int i = 0; i < lPiezas.size(); i++) {
            Pieza P = lPiezas.get(i);
            if (r.nextInt(2) == 0)
                P.setXY(r.nextInt(150) + 700, r.nextInt(400));
            else
                P.setXY(r.nextInt(130) + 20, r.nextInt(400));
        }
    }

    private Pieza crearPieza(int i, int j) {

        Pieza p = new Pieza(i * Col + j + 1);
        p.setTipo(i % 2 + 1);
        p.setXY(x + (ancho - n) * j, y + (alto - n) * i);
        return p;

    }

    public Pieza getPiesa(int p) {
        return lPiezas.get(p);
    }

    public Pieza eliminarPieza(int p) {
        return lPiezas.remove(p);
    }

    public void setPieza(Pieza p) {
        lPiezas.add(p);
    }

    public void setPieza(Pieza p, int pos) {
        lPiezas.add(pos, p);
    }

    public int length() {
        return lPiezas.size();
    }

    public int getAncho() {
        return ancho;
    }

    public int getAlto() {
        return alto;
    }

    public void setN(int n) {
        this.n = n;
    }

    public int getN() {
        return n;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public void setTotalAncho(int totalAncho) {
        this.totalAncho = totalAncho;
    }

    public void setTotalAlto(int totalAlto) {
        this.totalAlto = totalAlto;
    }

    public void setNax(int nax) {
        this.nax = nax;
    }

    public int getFil() {
        return Fil;
    }

    public int getCol() {
        return Col;
    }
}
